本日目標為抓取0050的收盤價,以下分為抓取1分K資料的部分和轉換成每日收盤價的部分
抓到的每日收盤價之後拿來做一些指標以及做回測,使用方法參考以下兩個永豐金的shioaji官方連結
https://sinotrade.github.io/tutor/login/
https://sinotrade.github.io/tutor/market_data/historical/
這邊是匯入程式庫
from shioaji.data import Kbars
import pandas as pd
import shioaji
這邊是登入的部分,以下是用測試帳號,如果是永豐金證券的客戶要用正式帳號登入就把simulation改False,ID改身分證字號,密碼用永豐金證券的密碼
api = shioaji.Shioaji(simulation=True)
person_id='PAPIUSER01'
passwd='2222'
api.login(
person_id=person_id,
passwd=passwd,
contracts_cb=lambda security_type: print(f"{repr(security_type)} fetch done.")
)
這邊可以抓取K棒,以0050當作範例,資料輸出到df,他最後面可以輸入k棒的起始和結束日期
kbars = api.kbars(api.Contracts.Stocks["0050"], start="2010-01-01", end="2021-09-02")
df = pd.DataFrame({kbars})
df.ts = pd.to_datetime(df.ts)
用print輸出df的內容,裡面有開高低收跟成交量,可以抓到將近3年內的1分K歷史資料,還滿佛的
print(df)
ts Low High Close Volume Open
0 2018-12-07 09:01:00 75.60 75.60 75.60 115 75.60
1 2018-12-07 09:02:00 75.60 75.60 75.60 46 75.60
2 2018-12-07 09:03:00 75.55 75.60 75.60 53 75.60
3 2018-12-07 09:04:00 75.60 75.70 75.65 104 75.60
4 2018-12-07 09:05:00 75.70 75.75 75.75 55 75.70
... ... ... ... ... ...
169109 2021-09-02 13:26:00 139.95 139.95 139.95 0 139.95
169110 2021-09-02 13:27:00 139.95 139.95 139.95 0 139.95
169111 2021-09-02 13:28:00 139.95 139.95 139.95 0 139.95
169112 2021-09-02 13:29:00 139.95 139.95 139.95 0 139.95
169113 2021-09-02 13:30:00 139.90 139.90 139.90 150 139.90
用以下指令可以抽取其中收盤價的部分
close=df['Close']
close.index=df.ts
轉成每日收盤價的做法就是從一分K的第一天LOOP到最後一天,然後把每一天的收盤價都抓出來湊成一個pandas.series
如果要抽取特定日期的分線資料可以用這個指令
close['2021-09-02']
用以下兩個指令可以抓取第一天和最後一天的日期
date_begin=close.index[0].date()
date_end=close.index[-1].date()
delta = datetime.timedelta(days=1)
用以下指令可以創建一個series,index是日期,數值放收盤價,先用create_PairForSeries把第一天的series做出來
def create_PairForSeries(date,close):
val=close[str(date)][-1]
return pd.Series({date:val})
dayclose=create_PairForSeries(date_begin,close)
這邊可以把後面的資料用同樣的function做成series,然後像人體蜈蚣一樣接在第一天的series後面,這邊的try except是用來處理假日沒有價格的問題用的
date_begin += delta
while date_begin <= date_end:
try:
append=create_PairForSeries(date_begin,close)
dayclose=dayclose.append(append)
except:
pass
date_begin += delta
print(dayclose)
2021-05-21 132.35
2021-05-24 132.15
2021-05-25 134.40
2021-05-26 100.00
2021-05-27 133.30
2021-08-24 134.85
2021-08-30 139.50
2021-08-31 140.35
2021-09-01 141.00
2021-09-02 139.90
Length: 68, dtype: float64
今天就到這邊為止,接下來的兩大課題是回測跟指標,明天沒意外應該會先弄個簡單的均線指標吧
題外話就是markdown排版有點難度,接下來可能還是把程式碼用圖片的方式貼上來
Hi 樓主
我複製您的程式碼進去測試
跑到 df = pd.DataFrame({kbars}) -> 出現TypeError: unhashable type: 'Kbars'
如果把大掛號 {} -> 中掛號 [],可以Pass 這行,但是下一行To_datetime又卡住了
希望您能夠撥空指點一下
先用
import pandas as pd
pd.show_versions()
看看pandas的版本,我這邊是pandas:1.3.2,如果比較舊的話可能需要更新,如果更新後還是無法用的話,把pandas版本貼上來我再研究看看,我這一段也是從shiaoji的文件看來的
Hi 樓主
我原本跑版本是1.2.4,所以我有更新Pandas 版本到1.3.2,如下圖
目前跑起來的狀況是一樣的
測試了三個開發環境,Jupyter, VS Code 跟Colab 都是同一行停下來, 希望您能幫忙看一下
感謝
Hi 樓主,
我回去找了永豐金的說明,他的寫法是
df = pd.DataFrame({**ticks})
所以原本的程式碼我從
df = pd.DataFrame({kbars})
改寫成
df = pd.DataFrame({**kbars})
就正常了~!
了解,看來是直接貼程式碼的時候**被轉成奇怪的東西了
Hi 樓主
抱歉,又是我有問題了
我解決掉DataFrame的問題後
跑到要把收盤價抓出來的迴圈
您的程式碼date_begin += delta
執行的結果是delta 未被定義
需要您在替我解惑
謝謝你的幫忙
我漏了一行,已經加進去了,多謝提醒
delta = datetime.timedelta(days=1)
感謝樓主,其實我的兩個問題在您的Day 4 函式打包過程中就都是正確了
ok
Hi 版主,看到你文章提到 markdown 會有困擾,給個小小的建議
如果要放 code 的話,可以嘗試用用 markdown 的 codeblock
** like this then star wont be eatten **
用三個```這樣開頭跟結尾,中間的程式碼就不會被影響,相較圖片,閱讀者也會比較好複製。開頭的地方可以寫```python 來暗示這段 markdown 的內容,有時候會有對應的highLight。
了解,我之後試試看